package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级流
 * ObjectOutputStream  对象输出流--传Person.java对象--写操作
 * ObjectInputStream   对象输入流--传Person.java对象--读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream  对象输出流
     * 使用方法：1.创建序列化接口的对象
     *         2.对象输出流---xxx.obj文件
     *                      传输对象，指定格式obj
     */
    @Test
    public void testOOS(){
        //1.创建Person对象
        Person p=new Person();
        p.setName("韩美娟");
        //数组--动态数组
        //    String[] str={"1","2","3"}; 动态数组
        //    String[] str=new String[]{"1"};
        p.setSay(new String[]{"百因必有果，你的报应就是我"});
        System.out.println("打印对象："+p);

        //对象输出写出文件  xxx.obj  Person.java
        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        /**
         * writeObject(Object obj)---理解写出对象
         * 该方法会将给定对象按照其构造进行转换
         * 转换为一组”组“字节，在通过其处理的流写出
         *
         * NotSerializableException
         * 原因：写出类没有实现序列化接口
         * 写出文件专业术语
         * 1.通过对象输出流将Person类，先转换为一组”组“字节
         *    这个过程【对象序列化】
         * 2.将序列化后的字节通过字节流【低级流】写入文件中
         *    【硬盘上】长久保存，这个过程【数据持续化】
         *    将Person.obj持久化保存在硬盘上
         */
        try {
            fos=new FileOutputStream("person.obj");
            oos=new ObjectOutputStream(fos);
            oos.writeObject(p);
            oos.flush();
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null)
                try {
                    fos.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
        }
        System.out.println("写出成功了");
    }


    /**
     *ObjectInputStream  对象输入流
     * 序列化:将对象转换为二进制
     * 反序列化：二进制转换为对象
     * readObject() 返回读取的对象【】
     * 需求：将序列化person.obj文件  按照对象方式读入
     */
    @Test
    public void testOIS(){
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        try {
            fis=new FileInputStream("person.obj");
            ois=new ObjectInputStream(fis);
            System.out.println(ois.readObject());
            System.out.println("反序列化成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        finally {
            if (fis != null)
                try {
                    fis.close();
                    ois.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
        }
    }
}
